module.exports = function (grunt) {

    /*
        Grunt installation:
        -------------------
            npm install -g grunt-cli
            npm install -g grunt-init
            npm init (creates a `package.json` file)

        Project Dependencies:
        ---------------------
            npm install grunt --save-dev
            npm install grunt-contrib-watch --save-dev
			npm install grunt-contrib-concat --save-dev
            npm install grunt-contrib-less --save-dev
			npm install grunt-contrib-uglify --save-dev
			npm install grunt-contrib-jshint --save-dev			
			npm install grunt-autoprefixer --save-dev	
			npm install grunt-contrib-imagemin --save-dev
			npm install grunt-newer --save-dev
			npm install time-grunt --save-dev 
    */
   	
   	// Load NPM Tasks
	grunt.loadNpmTasks('grunt-contrib-watch');
	grunt.loadNpmTasks('grunt-contrib-concat');
	grunt.loadNpmTasks('grunt-contrib-less');
	grunt.loadNpmTasks('grunt-contrib-uglify');
	grunt.loadNpmTasks('grunt-contrib-jshint');
	grunt.loadNpmTasks('grunt-autoprefixer');
	grunt.loadNpmTasks('grunt-contrib-imagemin');
	//grunt.loadNpmTasks('grunt-newer'); //Pour compiler que les nouveaux fichiers ou dernières modifs

	//on a besoin du module time-grunt
	require('time-grunt')(grunt);

    // Project configuration.
    grunt.initConfig({

		/*
		* Compilation less
		*/
		less: {
		
			// Compilation des fichiers less dans le dossier css
			// compréssé et sans commentaires
			dev: {
				options: {
					compress : true,
					cleancss: true
				},
				files: [{
					expand: true,
					cwd: 'less/',
					src: ['*.less'],
					dest: 'css/',
					ext: '.css'
				}]
			},

			//Pour générer des fichiers css non compressé
			//et avec commentaire
			distrib :{
				options: {
					compress : false,
					cleancss: false
				},
				files: [{
					expand: true,
					cwd: 'less/',
					src: ['*.less'],
					dest: 'css/',
					ext: '.css'
				}]
			},

			maintenance :{
				options: {
					compress : true,
					cleancss: true
				},
				files: [{
					expand: true,
					cwd: 'maintenance/',
					src: ['*.less'],
					dest: 'maintenance/',
					ext: '.css'
				}]
			},
		},

		/**
		* Concaténation
		*/
		concat: {
		
			// Tous les fichiers .css vers le fichier style.css dans le dossier /tmp
			css:{
				src: "css/**/*.css",
				dest: "tmp/style.css",
			},
			
			//Tous les fichiers concaténés vers _concat.js
			js:{
				options:{
					separator: ';'
				},
				src: "js/**/*.js",
				dest: "tmp/_concat.js",
			},

			maintenance :{
				src: "maintenance/**/*.css",
				dest: "tmp/maintenance.css",
			},
		},
		
		/**
		* Minification js
		*/
		uglify:{
			js:{
				files:{
					'tmp/core.js' : 'tmp/_concat.js'
				}
			},
		},
		
		/**
		* Validation code js
		*/ 
		jshint:{
		
			//Pour tous les fichiers js du dossier /js mais pas les librairies contenus dans js/libs
			dev:{
				src:'js/*.js',
				
				// options here to override JSHint defaults
				options: {				
					globals: {
						jQuery: true,
						console: true,
						document: true
					}
				}
			},
		},

		/**
		 * Autoprefixer css
		 * 
		 */
		autoprefixer: {

			options: {
				// Task-specific options go here.
				browsers: ['last 2 versions']
			},

			// prefix all files
			dist: {
				expand: true,
				flatten: true,
				src: 'css/*.css',
				dest: 'css/'
			},

			maintenance:{
				expand: true,
				flatten: true,
				src: 'maintenance/*.css',
				dest: 'maintenance/'
			},
		},

		/**
		 * Optimisation des images
		 * 
		 */
		imagemin: {
		    compress: {
		      options: {
		        optimizationLevel: 7, //Entre 0(min) et 7(max)
		        progressive : true, //Conversion sans perte
		        //pngquant: true //Converting 24/32-bit PNG images to paletted (8-bit) PNGs
		      },
		      files: [
		        {
		          expand: true,
		          cwd: 'static/img/', //Dossier source
		          src: ['**/*.{png,jpg,gif}'], //Match pattern
		          dest: 'static/img/' //Destination
		        }
		      ]
		    },
		},		
		
		/**
		* A faire à chaque modification de fichiers
		*/
		watch:{

			//Pour les fichiers js
			js:{
				options: {
					livereload: true,
				},
				files: 'js/**/*.js',

				//Concaténation + minification
				tasks: ['concat:js','uglify:js']
			},
			
			//Pour les fichiers less
			less:{
				options: {
					livereload: true,
				},
				files: 'less/**/*.less',

				//Compilation vers fichiers css 
				tasks: ['less:dev']
			},
			
			autoprefixer:{
				files: 'css/*.css',

				//Concaténation ds fichiers css
				tasks: ['autoprefixer:dist']
			},
			
			css:{
				files: 'css/**/*.css',

				//Concaténation ds fichiers css
				tasks: ['concat:css']
			},
		}
    });
	

    // Default Task watch:dev
    grunt.registerTask('default',['watch:dev']);

    // Maintenance watch
    grunt.registerTask('maintenance',  ['less:maintenance',
    									'autoprefixer:maintenance',
    									'concat:maintenance']);
	
	//Vérification js avec JSHint
	grunt.registerTask('validateJS',['jshint:dev']);

	//Optimisation des images
	grunt.registerTask('compressImg',['imagemin:compress']);
};